'''
图记忆和配置的使用  thread_id + MemorySaver方式
1.创建保存图的状态的字典
2.创建智能体 读取配置信息
3.创建带状态的图
4.创建节点 节点和智能体绑定
5.编译图和设置检测点保存 from langgraph.checkpoint.memory import MemorySaver _builder.compile(checkpointer=_memory)
6.通过图执行智能体和配置中加thread_id
添加 config信息  _graph.invoke({"foo":10},config=_configurable)
'''

from langgraph.graph import StateGraph, START, END
from typing import TypedDict, Annotated
from langgraph.checkpoint.memory import MemorySaver

#1.创建保存图的状态的字典
#定义一个类型化字典State,用于存储图的状态信息
#这里包含一个整数类型属性foo
class State(TypedDict):
    foo: int

#2.创建智能体
#智能体函数：接收当前状态，对foo值加1后返回新状态
def agent_01(state):
    return {"foo": state['foo'] + 1} #返回更新后的状态，将foo值加1

#3.创建带状态的图
#创建状态图构建器
builder = StateGraph(State)

# 4.创建节点 节点和智能体绑定
builder.add_node("agent_01", agent_01)
builder.add_edge(START, "agent_01")
builder.add_edge("agent_01", END)

# 创建内存存储器，用于保存图的状态检查点
# MemorySaver是langgraph提供的内存中的状态保存器
memory = MemorySaver()

#编译图，并配置检查点存储器
#这使得图在执行过程中会自动保存状态快照
graph = builder.compile(checkpointer=memory)
#定义配置信息：设置递归限制为2，线程ID，用于标识不同的对话/流程实例
conf = {"recursion_limit": 2, "configurable": {"thread_id":"u123"}}
r = graph.invoke({"foo":10},config=conf)
print(r)
print(memory)
print(memory.get(conf))
